package Offer.offer2022;

import domain.ListNode;

/**
 * 在O(1)时间删除链表节点
 */
public class Test13 {

    public static void deleteListNode(ListNode head, ListNode deletedNode) {
        if (head == null || deletedNode == null) {
            return;
        }
        //要删除的节点就是头结点，直接把头结点置空。
        if (deletedNode == head) {
            head = null;
            return;
        }
        //要删除的节点是尾结点，只能进行遍历了
        if (deletedNode.next == null) {
            deletedNodeNormal(head, deletedNode);
        }

        //一般情况，把deletedNode的下一个节点删除，前提是先把下一个节点的值先赋值到deletedNode
        //先赋值，再将deletedNode指向next节点的下一个节点
        deletedNode.val = deletedNode.next.val;
        deletedNode.next = deletedNode.next.next;
    }

    private static void deletedNodeNormal(ListNode head, ListNode deletedNode) {
        ListNode p = head;
        while (p.next != deletedNode) {
            p = p.next;
        }
        p.next = null;
    }
}
